from celery import Celery
from celery.signals import after_setup_logger
import logging
from logging.handlers import TimedRotatingFileHandler
import os
import tarfile
import shutil
from datetime import datetime

## 设置 django 的 settings 模块 celery 会读取这个模块中的配置信息
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'oabanck.settings')

app=Celery('oaback')

## 日志管理
def compress_log_namer(filename):
    """
    自定义命名：将 log.2025-08-01 这样的文件改为 log.2025-08.tar.gz
    但我们这里让 rotator 处理压缩，namer 可以不做处理
    """
    return filename  # 使用默认命名，由 rotator 压缩

def compress_rotator(source, dest):
    """
    将切割后的日志文件压缩为 .tar.gz，并删除原始文件
    dest 是类似 'celery.log.2025-08-01' 的文件
    """
    # 构造压缩包名：celery.log.2025-08.tar.gz
    base = dest.rsplit('.', 2)[0]  # celery.log
    date_part = dest.split('.')[-2]  # 2025-08-01
    year_month = date_part[:7]  # 2025-08
    tar_gz_name = f"{base}.{year_month}.tar.gz"

    # 如果压缩包已存在，先追加；否则创建
    mode = 'a' if os.path.exists(tar_gz_name) else 'w:gz'

    with tarfile.open(tar_gz_name, mode) as tf:
        tf.add(source, arcname=os.path.basename(source))  # 只加文件名

    # 删除原始切割文件
    if os.path.exists(source):
        os.remove(source)

@after_setup_logger.connect
def setup_logger(logger, *args, **kwargs):
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    log_dir = 'logs'
    os.makedirs(log_dir, exist_ok=True)

    log_file = os.path.join(log_dir, 'celery.log')

    # 按月切割，每月 1 号 00:00 切割
    fh = TimedRotatingFileHandler(
        filename=log_file,
        when='midnight',
        interval=1,
        backupCount=9999,  # 不限制保留数量（你想保留全部）
        encoding='utf-8'
    )

    # 设置按月切割（关键：通过计算每个月的天数来模拟）
    # 更简单做法：每天切割，但用 rotator 按月合并压缩
    fh.suffix = "%Y-%m-%d"  # 切割文件名为 celery.log.2025-08-01
    fh.extMatch = r"^\d{4}-\d{2}-\d{2}$"  # 匹配日期格式

    # 设置压缩逻辑
    fh.rotator = compress_rotator
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(formatter)
    logger.addHandler(fh)
##配置从 settings.py 中读取 celery配置信息 所有Celery配置信息 都要以 celery 开头
app.config_from_object('django.conf:settings',namespace='CELERY')

## 自动发现任务 任务可以卸载 app/tasks.py 中
app.autodiscover_tasks()

##定义测试任务
@app.task(bind=True,ingnore_result=True)
def debug_task(self):
    print("我是 oabanck 中的 celery.....自定义的测试任务")
    print("1111111111111111111111111111")